/*
 * socket.cpp
 *
 *  Created on: 03/10/2011
 *      Author: guido
 */

#include "socket.h"
#include "serializador.h"
#include "constantes.h"
#include <cstdio>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/types.h>

Socket::Socket(char* puerto, char* direccion) {
	struct hostent *he;// información de la dirección de destino

	if ((he = gethostbyname(direccion)) == NULL) { // obtener información de máquina
		perror("gethostbyname");
		printf("%s\n", strerror(errno));
		exit(1);
	}
	// Socket internet, y un Stream (TCP)
	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
		perror("socket");
		printf("%s\n", strerror(errno));
		exit(1);
	}
	short unsigned int port = atoi(puerto);
	//PORT a short unsigned int


	// Completamos la estructura con la dirección y puerto destino
	address.sin_family = AF_INET; // Orden de bytes de la máquina
	address.sin_port = htons(port); // short, Orden de bytes de la red
	address.sin_addr = *((struct in_addr *) he->h_addr);
	memset(&(address.sin_zero), 8, sizeof(int)); // poner a cero el resto
}

Socket::Socket(int sockfd) {
	this->sockfd = sockfd;
}

Socket::~Socket() {
	close(sockfd);
}

bool Socket::valido() {
	if (this->sockfd < 0)
		return false;
	else
		return true;
}

void Socket::enviar(char* buffer, int tamanyo) {
	write(sockfd, buffer, tamanyo);
}

void Socket::enviarCadena(std::string cadena) {
	Serializador serializador;
	char* serial = NULL;
	int tamanyo = 0;
	serializador.serializarCadena(serial, cadena, tamanyo);
	enviar(serial, tamanyo);
	delete[] serial;
}

void Socket::recibir(char* buffer, int tamanyo) {
	recv(sockfd, buffer, tamanyo, 0);
}

std::string Socket::recibirCadena() {
	Serializador serializador;
	char* temp = new char[WORD_SIZE];
	recibir(temp, WORD_SIZE);
	int tamanyo = 0;
	int size = serializador.deserializarInteger(temp, tamanyo);
	delete[] temp;
	temp = new char[size];
	recibir(temp, size);
	std::string salida(temp, size);
	delete[] temp;
	return salida;
}
